// Player.h

// Objekt sveta reprezentujuci hraca

#ifndef PLAYER_H
#define PLAYER_H

#include "Player/World/Movable.h"
#include "Common/World/Types.h"
#include "Common/World/ParamStructs.h"

// Objekt sveta reprezentujuci hraca. Dedi od pohybujuceho sa objektu sveta
class Player : public Movable
{
protected:
	
	// OUR, THEIR, UNKNOWN
	Side side;
	// Cislo dresu (0 => nezname)
	int uniform;
	// Je hrac brankarom?
	bool goalie;
	// Uhol od osi X
	Angle absDir;
	// Uhol ukazujucej ruky od osi X
	Angle armDir;
	// Uhol od osi hlavy 
	Angle neckDir;
	// Platnost informacie o smeroch
	bool dirValid;
	// Platnost informacie o smere ukazujucej ruky
	bool armValid;

public:
	
	// Poiter na typ hraca
	PLAYER_TYPE* type;
	
	// Konstruktor
	Player(World* w);
	// Parametricky konstruktor
	Player(const Player&);

	// Destuktor 
	virtual ~Player();

	// Operator priradenia
	virtual Player& operator =(const Player&);
	
	// Vrati velkost uhlu od osi X
	Angle GetAbsDir() const
	{ 
		return absDir; 
	}
	// Vrati velkost uhlu ukazujucej ruky od osi X
	Angle GetArmDir() const
	{ 
		return armDir; 
	}
	// Vrati velkost uhlu od osi hlavy
	Angle GetNeckDir() const
	{ 
		return neckDir; 
	}
	// Vrati cislo dresu hraca
	int GetUniform() const
	{ 
		return uniform; 
	}
	
	// Vrati stranu na ktorej hra hrac (OUR, THEIR, UNKNOWN)
	virtual Side GetSide() const {
		return side;
	}

	// Je informacie ukazujucej ruky platna?
	bool IsArmValid() const
	{ 
		return armValid;
	}
	// Je informacie o smere natocenia hraca platna?
	bool IsDirValid() const
	{ 
		return dirValid;
	}
	// Je hrac brankarom?
	bool IsGoalie() const
	{
		return goalie;
	}
	
	// Nastavi absolutny smer natocenia hraca
	void SetAbsDir(Angle d)
	{ 
		absDir = d; 
	}	
	// Nastavi uhol ukazujucej ruky
	void SetArmDir(Angle d)
	{ 
		armDir = d; 
	}
	// Nastavi platnost informacie ukazujucej ruky
	void SetArmValid(bool v = true)
	{ 
		armValid = true; 
	}
	// Nastavi platnosti informacie o natoceni hraca
	void SetDirValid(bool v = true) {
		dirValid = true; 
	}
	// Urobi hraca brankarom
	void SetGoalie(bool g = true) 
	{
		goalie = g; 
	}
	// Nastavi smer natocenia krku (relativne k abs. natoceniu tela hraca)
	void SetNeckDir(Angle d)
	{ 
		neckDir = d;
	}
	// Nastavi typ hraca
	void SetType(int i);
	// Nastavi cislo dresu hraca
	void SetUniform(int u);

	// Nastavi stranu hraca, na ktorej bude hrat
	virtual void SetSide(Side s);
	
	// Predpoveda stav hraca v dalsom kroku
	void Step();

};

#include "Player/World/World.h"

#endif // PLAYER_H
